/**
 * 测试AI聊天修复效果
 * 
 * 这个测试脚本用于验证AI聊天模块的改进效果，特别是：
 * 1. 修复AI消息重复出现的问题
 * 2. 优化工具调用实现
 * 3. 增强流式响应处理
 * 
 * 使用方法：
 * 1. 确保后端和前端服务都已启动
 * 2. 在浏览器中打开聊天页面
 * 3. 运行此测试脚本：node test-ai-chat-fixes.js
 * 4. 观察控制台输出和浏览器中的聊天界面
 */

const fetch = require('node-fetch').default;
const AbortController = require('abort-controller');

// 配置
const API_URL = 'http://localhost:3000/api/chat/enhanced-stream';
const AUTH_TOKEN = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJiMTNjOTAyMS03YjE5LTQxMTUtOGJlMi1lMTQ1NzY4MTUxYmUiLCJpYXQiOjE2MTYxNjI4MDB9.example-token'; // 替换为有效的测试token

// 测试场景
const TEST_SCENARIOS = [
  {
    name: '基础对话测试',
    messages: [
      { role: 'system', content: '你好，我是AIDE助手，可以帮你创建/调整任务、安排时间与提醒。' },
      { role: 'user', content: '你好，请介绍一下你自己' }
    ]
  },
  {
    name: '创建任务测试',
    messages: [
      { role: 'system', content: '你好，我是AIDE助手，可以帮你创建/调整任务、安排时间与提醒。' },
      { role: 'user', content: '创建一个明天下午3点提醒我开会的任务' }
    ]
  },
  {
    name: '连续对话测试',
    messages: [
      { role: 'system', content: '你好，我是AIDE助手，可以帮你创建/调整任务、安排时间与提醒。' },
      { role: 'user', content: '你好' },
      { role: 'assistant', content: '你好！我是AIDE助手，有什么可以帮到你的吗？我可以帮你创建任务、安排时间、设置提醒等。' },
      { role: 'user', content: '我需要安排一个会议' }
    ]
  },
  {
    name: '错误处理测试',
    messages: [
      { role: 'system', content: '你好，我是AIDE助手，可以帮你创建/调整任务、安排时间与提醒。' },
      { role: 'user', content: '执行一个不存在的函数' }
    ]
  }
];

// 测试函数
async function runTest(scenario) {
  console.log(`\n===== 开始测试: ${scenario.name} =====`);
  
  const controller = new AbortController();
  const timeoutId = setTimeout(() => controller.abort(), 30000); // 30秒超时
  
  try {
    const response = await fetch(API_URL, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': `Bearer ${AUTH_TOKEN}`
      },
      body: JSON.stringify({
        messages: scenario.messages,
        sessionId: `test-${Date.now()}`
      }),
      signal: controller.signal
    });
    
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    
    if (!response.body) {
      throw new Error('Response body is null');
    }
    
    const reader = response.body;
    const decoder = new TextDecoder('utf-8');
    
    console.log('开始接收SSE流...');
    
    let messageId = null;
    let messageContent = '';
    let functionCalls = [];
    let functionResults = [];
    
    while (true) {
      const { value, done } = await reader.read();
      if (done) break;
      
      const chunk = decoder.decode(value, { stream: true });
      const lines = chunk.split('\n\n');
      
      for (const block of lines) {
        const line = block.trim();
        if (!line || !line.startsWith('data:')) continue;
        
        try {
          const payload = line.slice(5).trim();
          if (payload === '[DONE]') {
            console.log('流结束');
            break;
          }
          
          const data = JSON.parse(payload);
          
          // 跟踪消息ID
          if (data.messageId) {
            if (!messageId) {
              messageId = data.messageId;
              console.log(`新消息ID: ${messageId}`);
            } else if (data.messageId !== messageId) {
              console.warn(`警告: 收到不同的消息ID! 预期 ${messageId}, 收到 ${data.messageId}`);
            }
          }
          
          // 处理不同类型的事件
          if (data.delta) {
            messageContent += data.delta;
            process.stdout.write('.');
          }
          
          if (data.functionCall) {
            functionCalls.push(data.functionCall);
            console.log(`\n收到函数调用: ${data.functionCall.name}`);
          }
          
          if (data.functionResult) {
            functionResults.push(data.functionResult);
            console.log(`\n收到函数结果: ${data.functionResult.name}`);
          }
          
          if (data.error) {
            console.error(`\n错误: ${data.error}`);
          }
          
          if (data.final) {
            console.log('\n流完成');
          }
        } catch (e) {
          console.error('解析SSE数据失败:', e);
        }
      }
    }
    
    console.log('\n\n最终消息内容:');
    console.log(messageContent || '(无内容)');
    
    console.log('\n函数调用:');
    console.log(functionCalls.length ? JSON.stringify(functionCalls, null, 2) : '(无函数调用)');
    
    console.log('\n函数结果:');
    console.log(functionResults.length ? JSON.stringify(functionResults, null, 2) : '(无函数结果)');
    
    console.log(`\n===== 测试完成: ${scenario.name} =====`);
  } catch (error) {
    if (error.name === 'AbortError') {
      console.error('测试超时!');
    } else {
      console.error('测试失败:', error);
    }
  } finally {
    clearTimeout(timeoutId);
  }
}

// 运行所有测试
async function runAllTests() {
  console.log('开始AI聊天修复效果测试...');
  
  for (const scenario of TEST_SCENARIOS) {
    await runTest(scenario);
  }
  
  console.log('\n所有测试完成!');
}

runAllTests().catch(console.error);
